/*
 * @copyright: Copyright (c) 2024 zhengqi.com, Inc. All Rights Reserved
 * @Author: likang(likang@baidu.com)
 * @Date: 2024-01-05 16:32:38
 * @FilePath: mem/src/sensor/gps_component/f9k/gps_helper.h
 * @brief:
 */
#pragma once

#include "math.h"
#include "string.h"
#include <arpa/inet.h>
#include <iomanip>
#include <iostream>
#include <memory>

namespace sensor::gps {

struct GPSSetting {
    int distance;
    int mode;
};

typedef struct _GYRO {
    float gyrox; // 惯性器件x 轴角速度，单位 rad/s
    float gyroy; // 惯性器件y 轴角速度，单位 rad/s
    float gyroz; // 惯性器件z 轴角速度，单位 rad/s
} Gx_Gyro_Stru;
typedef struct _GX_ACC {
    float accx; // 惯性器件x 轴加速度，单位m/s2
    float accy; // 惯性器件y 轴加速度，单位m/s2
    float accz; // 惯性器件z 轴加速度，单位m/s2
} Gx_Acc_Stru;

typedef struct __LLA {
    float latitude; // 纬度
    float longitude; // 经度
    float height_over_sea; // 基于海平面的高度,单位m
} LLA_Stru;

typedef struct SPEED_Cog {
    float speed; // 地面速率，单位为m/s，固定输出3 位小数
    float cog; // 地面航向，单位为度，从北向起顺时针计算
} Speed_Cog_Stru;

/* GPS消息交互结构体 */
typedef struct {
    uint64_t frame_id; //
    uint64_t timestamp; // 时间戳
    float travel_distance; // 距离上次行驶距离
    LLA_Stru lla; // LLA 是 Latitude Longitude Altitude的缩写,意思 经纬度高度
    Speed_Cog_Stru speed_cog;
    Gx_Gyro_Stru gx_gyro; // 惯性器件 角速度，单位 rad/s
    Gx_Acc_Stru gx_acc; // 惯性器件 加速度，单位m/s2
} GPSData;

/* IMU消息交互结构体 */
typedef struct {
    uint64_t timestamp; // 本次时间戳,单位是us
    Gx_Gyro_Stru gx_gyro; // 惯性器件 角速度，单位 rad/s
    Gx_Acc_Stru gx_acc; // 惯性器件 加速度，单位m/s2
} IMUInfo;

using GPSOriginDataPtr = std::shared_ptr<GPSData>;
}
